<!--
 * @Description:
 * @version:
 * @Author: 尹鹏孝
 * @Date: 2023-03-16 17:27:29
 * @LastEditors: 尹鹏孝
 * @LastEditTime: 2023-03-17 16:06:42
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>promise等....</title>
</head>
<body>

    <script>
       //let promise = new  Promise();
       //异步操作，里面是未来发生的结果、
        //    1、状态不受外界影响，有三种状态，pending,fulfilled和reject,其他手段无法改变。
        //    2、状态一旦改变无法撤回，也不会再变。状态只能从padding到fulfilled或者padding到reject。,只要这两种情况发生，状态就凝固了，resolve已经定型。
        //    promise缺点：无法取消，不能设置回调，内部抛出错误不能返回大到外部，pending状态改变无法得知进展到哪个阶段
        // promise是立即执行，后等待pending状态改变后再执行。所以then里面的是异步
        //promise实现一个ajax
       const  getJSON = function(url){

        const promise = new Promise(function(res, reject){
            const client = new XMLHttpRequest();
            const handler = function () {
                // console.log(this.status)
                // if (this.status !== 4) {

                //    this.response;
                // }
                 res(this.response);
                // if (this.status == 200) {
                //     //  console.log(this.response)
                //   res(this.response);
                // } else {
                //     reject(new Error(this.statusText));
                // }
            }
            client.open("GET",url)
            client.onreadystatechange= handler
            client.responseType='json'
            client.setRequestHeader("Accept","application/json")
            client.send();
        })
        return promise;
       }
    getJSON('./json.json').then(function(json){
        console.log('dddd',json)
    }, function (error) {
        console.error('出错了', error);
    }).catch(error=>console.log(error));


    new Promise((resolve,reject)=>{
        //throw new Error('test');
        // debugger
        resolve(1)
        setTimeout(function(){
             throw new Error('111test');
        },20000)
        //  throw new Error('111test');

        console.log(2)

    }).then(r=>console.log(r)).catch(err=>console.log(err)).finally(()=>{
        console.log(3456)
    })

    Promise.all([1,2,3,4]).then(res=>{
        console.log('输出res:',res,'所有的数据都成功，只要有一个失败就报错！')
    })

    Promise.race([12, 23, 33, 43]).then(res => {
            console.log('输出res:', res, '所有的数据只要一个成功，就执行下一步！')
    })


    Promise.allSettled([1,2,3,4, getJSON('./json.json')]).then(res=>{
        console.log('输出res:allSettled',res)
        let mg = res.filter(t=>t.status=== "fulfilled")
        console.log(mg.map(item=>item.value));
        // .map(t=>t.value)
    })
    Promise.allSettled([1, 2, 3, 4, Error()]).then(res => {
        console.log('输出res:allSettled', res)
        let mg = res.filter(t => t.status === "reject")
        console.log(mg.map(item => item.value));
        // .map(t=>t.value)
    })

    Promise.any([Promise.reject(-1), Promise.resolve(1)]).then(res => {
            console.log('输出res-any:', res, '有一个数据是fulfilled，如果所有的状态都是rejected，实例就是rejected，Promise.any和race区别是只有当所有的都变成reject状态才结束，race是有一个成功，就结束')
        }).catch(res=>{
            console.log(res)
        })

        // 将现有对象改为Promise
        Promise.resolve('foo')
         Promise.resolve('foo')
        //  Promise.resolve 的四种情况
        // 1、不带参数：返回resolved状态对象。
        // 2、具有then方法的对象，将方法转为Promise然后立即执行对象的then方法。
        // 3、不带then方法或者不是对象原始值，返回一个新的Promise对象，状态改为resolved。
        // 4、参数是一个Promise实例，Promise不做任何修改，原封不动返回这个实例。


    </script>
</body>
</html>